# -*- coding: utf-8 -*-
"""
@Version : 
@Author  : ChenMZ
@Time    : 2025/09/22
@File    : cpu_entity.py
@Desc    : CPU 实体
@Modify  : 
"""
import psutil
from typing import Optional
from device.define import (CpuArchitecture, CpuAvailability, CpuStatusEnum, CpuProcessorType)
from device.dev_entity.abc_entity import DevEntity


class CpuEntity(DevEntity):

    def __init__(self, current_cpu):
        self.cpu_base = current_cpu
        self.interval_seconds: Optional[int] = 1

    def to_dict(self):
        attr_dict = {}
        info_str = self.__dict__["cpu_base"].__str__()
        info_list = info_str.split("{\n\t")[-1].split("}")[0].replace("\n", "").replace("\t", "").split(";")[:-1]
        for attr in info_list:
            key, val = attr.split(" = ")
            attr_dict[key] = val.replace("\"", "")
        return attr_dict

    @property
    def address_width(self) -> int:
        """
        在已配置地址空间内，操作系统运行的处理器地址宽度（以位为单位）。例如，在基于 x64 的处理器上运行 32 位操作系统，此值为 32。

        :return: int
        """
        return self.cpu_base.AddressWidth

    @property
    def architecture(self) -> CpuArchitecture:
        """
        处理器架构类型。它是一个整数值，代表不同的 CPU 家族。
        常见值：
        0： x86
        1： MIPS
        2： Alpha
        3： PowerPC
        5： ARM
        6： ia64 (Itanium)
        9： x64 (AMD/Intel 64位)
        12： ARM64

        :return: CpuArchitecture
        """
        return CpuArchitecture(self.cpu_base.Architecture)

    @property
    def asset_tag(self) -> str:
        """
        激活方式

        :return: str
        """
        return self.cpu_base.AssetTag

    @property
    def characteristics(self) -> int:
        """
        定义处理器支持哪些功能。
        此值来自 SMBIOS 信息中处理器信息结构的处理器特征成员。
        :return:
        """
        return self.cpu_base.Characteristics

    @property
    def config_manager_error_code(self) -> int:
        """
        Windows API Configuration Manager 错误代码。
        详细信息请在 https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-processor 中查看
        :return: int

        """
        return self.cpu_base.ConfigManagerErrorCode

    @property
    def availability(self) -> CpuAvailability:
        """
        设备的可用性和状态。例如，是否正在运行、断电、离线等

        :return: CpuAvailability
        """
        return CpuAvailability(self.cpu_base.Availability)

    @property
    def caption(self) -> str:
        """
        处理器的一个简短文本描述。通常是 CPU0, CPU1 等

        :return: str
        """
        return self.cpu_base.Caption

    @property
    def cpu_status(self) -> CpuStatusEnum:
        """
        处理器的当前状态。对于大多数运行中的系统，此值为 1 - 启用。

        :return: CpuStatus
        """
        return CpuStatusEnum(self.cpu_base.CpuStatus)

    @property
    def current_clock_speed(self) -> int:
        """
        处理器的当前时钟频率（以 MHz 为单位）。在启用了节能技术（如 Intel SpeedStep 或 AMD Cool'n'Quiet）的系统上，这个值可能会低于 max_clock_speed

        :return: int
        """
        return self.cpu_base.CurrentClockSpeed

    @property
    def current_voltage(self) -> int:
        """
        处理器的当前电压。单位为 10mV。例如，值 133 表示 1.33V。

        :return: int
        """
        return self.cpu_base.CurrentVoltage

    @property
    def data_width(self) -> int:
        """
        处理器的数据宽度（以位为单位）。对于现代 64 位处理器，此值为 64。它表示 CPU 一次可以处理的数据量。

        :return: int
        """
        return self.cpu_base.DataWidth

    @property
    def description(self) -> str:
        """
        处理器的详细文本描述。通常包含制造商、型号和频率信息，例如 Intel64 Family 6 Model 142 Stepping 10 GenuineIntel ~1800 Mhz

        :return: str
        """
        return self.cpu_base.Description

    @property
    def device_id(self) -> str:
        """
        此处理器的唯一标识符。在多处理器系统中，用于区分各个 CPU，例如 CPU0

        :return: str
        """
        return self.cpu_base.DeviceID

    @property
    def ext_clock(self) -> int:
        """
        外部时钟频率，即主板前端总线（FSB）频率（以 MHz 为单位）。在现代系统中（如使用 DMI 或 QPI 的 CPU），这个值可能不准确或为 null

        :return: int
        """
        return self.cpu_base.ExtClock

    @property
    def family(self) -> int:
        """
        识处理器的主要家族或类型。它与 Architecture 配合使用，可以更精确地识别 CPU
        详情见 https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-processor
        :return: int
        """
        return self.cpu_base.Family

    @property
    def l2_cache_size(self) -> int:
        """
        L2缓存大小，单位KB
        :return:  int
        """
        return self.cpu_base.L2CacheSize

    @property
    def l2_cache_speed(self) -> int:
        """
        L2缓存的时钟速度
        :return: int
        """
        return self.cpu_base.L2CacheSpeed

    @property
    def l3_cache_size(self) -> int:
        """
        L3缓存大小，单位KB
        :return: int
        """
        return self.cpu_base.L3CacheSize

    @property
    def l3_cache_speed(self) -> int:
        """
        L3缓存的时钟速度
        :return: int
        """
        return self.cpu_base.L3CacheSpeed

    @property
    def load_percentage(self) -> int:
        """
        每个处理器当前的负载百分比。这是非常有用的性能监控指标。对于多处理器，每个 CPU 实例都有自己独立的负载值
        :return: int
        """
        return self.cpu_base.LoadPercentage

    @property
    def recent_percentage(self):
        """
        最近的使用率，通过interval_seconds成员变量控制, None则表示
        :return:
        """
        return psutil.cpu_percent(interval=self.interval_seconds)

    @property
    def manufacturer(self) -> str:
        """
         处理器的制造商名称。例如，GenuineIntel 或 AuthenticAMD
        :return: str
        """
        return self.cpu_base.Manufacturer

    @property
    def max_clock_speed(self) -> int:
        """
        处理器的最大额定时钟频率（以 MHz 为单位）。这是 CPU 标称的主频，是固定值
        :return: int
        """
        return self.cpu_base.MaxClockSpeed

    @property
    def cpu_name(self) -> str:
        """
        处理器的全名，通常是人类可读的完整型号。例如，Intel(R) Core(TM) i7-10700K CPU @ 3.80GHz
        :return: str
        """
        return self.cpu_base.Name

    @property
    def number_of_cores(self) -> int:
        """
        此物理处理器中的核心数量。例如，一个 8 核 CPU 此值为 8
        :return: int
        """
        return self.cpu_base.NumberOfCores

    @property
    def number_of_enabled_core(self) -> int:
        """
        在操作系统中启用的核心数量。通常与 NumberOfCores 相同，除非在 BIOS 中禁用了某些核心。
        :return: int
        """
        return self.cpu_base.NumberOfEnabledCore

    @property
    def number_of_logical_processors(self) -> int:
        """
        此物理处理器中的逻辑处理器数量。如果开启了超线程（HTT）或同步多线程（SMT），这个值将是 number_of_cores 的两倍（或更多）
        :return: int
        """
        return self.cpu_base.NumberOfLogicalProcessors

    @property
    def processor_id(self) -> str:
        """
        一个依赖于处理器的唯一 ID。对于 x86 处理器，这通常是基于 CPUID 指令的十六进制字符串，可用于硬件指纹识别
        :return: str
        """
        return self.cpu_base.ProcessorId

    @property
    def processor_type(self) -> CpuProcessorType:
        """
        处理器的类型（如中央处理器、数学协处理器）。
        常见值： 3 - 中央处理器。
        :return: CpuProcessorType
        """
        return CpuProcessorType(self.cpu_base.ProcessorType)

    @property
    def revision(self) -> Optional[int]:
        """
        处理器的版本号或步进（Stepping）信息。
        :return: Optional[int]
        """
        return self.cpu_base.Revision

    @property
    def socket_designation(self) -> str:
        """
        此处理器所在的主板插槽类型。例如，Socket AM4, U3E1。
        :return: str
        """
        return self.cpu_base.SocketDesignation

    @property
    def is_ok(self) -> bool:
        """
        对象的当前状态。通常是 OK。
        :return: bool
        """
        return True if self.cpu_base.Status == "OK" else False

    @property
    def thread_count(self) -> int:
        """
        每个处理器套件的线程数。通常与 number_of_logical_processors 相同。
        :return: int
        """
        return self.cpu_base.ThreadCount

    @property
    def version(self) -> str:
        """
        依赖于处理器的版本号。
        :return: str
        """
        return self.cpu_base.Version

    @property
    def virtualization_firmware_enabled(self) -> bool:
        """
        指示是否在固件（BIOS/UEFI）中启用了硬件辅助虚拟化（如 Intel VT-x 或 AMD-V）。
        :return: bool
        """
        return self.cpu_base.VirtualizationFirmwareEnabled

    @property
    def voltage_caps(self) -> Optional[int]:
        """
        一个位掩码，表示处理器的电压能力。
        :return: Optional[int]
        """
        return self.cpu_base.VoltageCaps
